#include <bits/stdc++.h>
using namespace std;

const int maxn = 1000005,maxe = 1000005;
struct linkList {
    typedef struct {int u,v,w,next;} edge;
    edge e[maxe];
    int h[maxn],edge_cnt=0;
    linkList(){	//构造函数
        edge_cnt=0;
        memset(h,-1,sizeof(h));
    }
    //遍历点u 周围点
    template<typename U>
    void for_each(int u,U func){
        for(int i = h[u] ; i !=-1;i = e[i].next)
            func(e[i].u,e[i].v,e[i].w); //u v w
    }
    void add(int u,int v,int w=0){
        e[edge_cnt] = {u,v,w,h[u]};
        h[u] = edge_cnt++;
    }
    void add2(int u,int v,int w=0){
        add(u,v,w);
        add(v,u,w);
    }
    edge& operator[](int i){
        return e[i];
    }
    void sort(){
        std::sort(e,e+edge_cnt,[](edge &e1,edge& e2){ return e1.w < e2.w; });
    }
} e;

template <std::size_t SIZ>
struct cut_vertices{
private:
    int child_cnt = 0; //记录 root 孩子数量
    int dfn_cnt = 0;
    int dfn[SIZ],low[SIZ];
    bool cut[SIZ+1]; // 记录点i是否是割点
    int cut_cnt = 0; //表示割点数量
    linkList &e ;//linkList 的引用
    int root; //根结点的编号
public:
    cut_vertices(linkList &e ,int r = 1) : 
        e{e},root{r}
    {}
    
    //点u是否访问过
    bool vis(int u) { return dfn[u] != 0;}
    bool iscut(int u) { return cut[u];}
    int size() { return cut_cnt;}

    void work(int u = 1,int fa=1) {
        dfn[u] = low[u] = ++dfn_cnt;
        for(int i = e.h[u]; ~i ; i =e[i].next){
            int v = e[i].v;
            if( !dfn[v]) { //没有访问过，是 树枝边
                work(v,u);
                // 能过孩子来更新dfn
                low[u] = std::min(low[u],low[v]);
                if( u == root) child_cnt++; //记录root的孩子数量
                // 此时，从孩子回溯来，检查孩子v是否能[越过]u
                if(low[v] >= dfn[u] && u != root)
                    cut[u] = 1,cut_cnt++;
            }
            else if( v != fa) // 不是父亲
                low[u] = std::min(low[u],dfn[v]);
                // 访问过v，(u,v)是返祖边
        }
        //检查根是否是割点
        if( u == root && child_cnt > 1)
            cut[u] = 1,cut_cnt++;
    }
};


cut_vertices<10000> cv(e);
int main(){
    int n,m;
    cin >> n >> m;
    for(int i =1;i<=m;i++){
        int u,v;
        cin >> u >> v;
        e.add2(u,v);
    }
    
    for(int i=1;i<=n;i++){
        if( cv.vis(i) == 0)
            cv.work(i);
    }

    for(int i=1;i<=n;i++){
        if( cv.iscut(i) )
            cout << i << " ";
    }

    cout << "cut vertices total is " << cv.size() << endl;


    return 0;
}

